package Providers

import (
	"errors"
	"fmt"
	"hyper/app/Models"
	"hyper/seeders"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"

	"hyper/supports/configs"
	"hyper/supports/database"
)

func Database() {

	var dbConfig gorm.Dialector

	switch configs.Get("database.connection") {
	case "mysql":
		// 构建 DSN 信息
		dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=True&multiStatements=true&loc=Local",
			configs.Get("database.mysql.username"),
			configs.Get("database.mysql.password"),
			configs.Get("database.mysql.host"),
			configs.Get("database.mysql.port"),
			configs.Get("database.mysql.database"),
			configs.Get("database.mysql.charset"),
		)
		dbConfig = mysql.New(mysql.Config{
			DSN:                       dsn,   // DSN data source name
			DefaultStringSize:         256,   // string 类型字段的默认长度
			DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
			DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
			DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
			SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
		})
	case "postgres":
		// 构建 DSN 信息
		dsn := fmt.Sprintf("host=%v user=%s password=%s dbname=%s port=%v sslmode=disable TimeZone=Asia/Shanghai",
			configs.Get("database.postgres.host"),
			configs.Get("database.postgres.username"),
			configs.Get("database.postgres.password"),
			configs.Get("database.postgres.database"),
			configs.Get("database.postgres.port"),
		)

		// fmt.Printf("链接数据库地址 %v\n", dsn)

		dbConfig = postgres.New(postgres.Config{
			DSN:                  dsn,
			PreferSimpleProtocol: true, // 禁用隐式准备语句用法
		})
	case "sqlite":
		// 构建 DSN 信息
		database := configs.Get("database.sqlite.database")
		dbConfig = sqlite.Open(database)
	default:
		panic(errors.New("database connection not support"))
	}

	// 连接数据库，并设置 GORM 的日志模式
	database.Connect(dbConfig, logger.Default.LogMode(logger.Info))
	//database.Connect(dbConfig, logger.Default.LogMode(logger.Warn))

	// 设置最大连接数
	database.SQLDB.SetMaxOpenConns(configs.GetInt("database.mysql.max_open_connections"))
	// 设置最大空闲连接数
	database.SQLDB.SetMaxIdleConns(configs.GetInt("database.mysql.max_idle_connections"))
	// 设置每个链接的过期时间
	database.SQLDB.SetConnMaxLifetime(time.Duration(configs.GetInt("database.mysql.max_life_seconds")) * time.Second)

	migration()
	seeders.RunSeeders()
}

func migration() {
	// 迁移
	database.DB.AutoMigrate(
		// &user.User{},
		&Models.Admin{},
		&Models.Role{},
		&Models.Menu{},
		&Models.Permission{},
		&Models.AdminRole{},
		&Models.Power{},
	)

}
